package com.example.fridaykt.common.result

import com.example.fridaykt.common.constant.HttpStatus
import java.util.*


/**
 * 操作消息提醒
 */
class R : HashMap<String?, Any?> {
    /**
     * 初始化一个新创建的 RestResult 对象，使其表示一个空消息。
     */
    constructor()

    /**
     * 初始化一个新创建的 RestResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    constructor(code: Int, msg: String?, status: Boolean) {
        super.put(CODE_TAG, code)
        super.put(MSG_TAG, msg)
        super.put(STATUS_TAG, status)
    }

    /**
     * 初始化一个新创建的 RestResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    constructor(code: Int, msg: String?, data: Any?, status: Boolean) {
        super.put(CODE_TAG, code)
        super.put(MSG_TAG, msg)
        super.put(STATUS_TAG, status)
        if (Objects.nonNull(data)) {
            super.put(DATA_TAG, data)
        }
    }

    companion object {
        private const val serialVersionUID = 1L

        /**
         * 状态码
         */
        const val CODE_TAG: String = "code"

        /**
         * 返回内容
         */
        const val MSG_TAG: String = "message"

        const val STATUS_TAG: String = "status"

        /**
         * 数据对象
         */
        const val DATA_TAG: String = "data"

        /**
         * 返回成功消息
         *
         * @return 成功消息
         */
        fun success(): R {
            return success("操作成功")
        }

        /**
         * 返回成功数据
         *
         * @return 成功消息
         */
        fun success(data: Any?): R {
            return success("操作成功", data)
        }

        /**
         * 返回成功消息
         *
         * @param msg 返回内容
         * @return 成功消息
         */
        fun success(msg: String?): R {
            return success(msg, null)
        }

        /**
         * 返回成功消息
         *
         * @param msg  返回内容
         * @param data 数据对象
         * @return 成功消息
         */
        fun success(msg: String?, data: Any?): R {
            return R(HttpStatus.SUCCESS, msg, data, true)
        }

        /**
         * 返回错误消息
         *
         * @return
         */
        fun error(): R {
            return error("操作失败")
        }

        /**
         * 返回错误消息
         *
         * @param msg 返回内容
         * @return 警告消息
         */
        fun error(msg: String?): R {
            return error(msg, null)
        }

        /**
         * 返回错误消息
         *
         * @param msg  返回内容
         * @param data 数据对象
         * @return 警告消息
         */
        fun error(msg: String?, data: Any?): R {
            return R(HttpStatus.ERROR, msg, data, false)
        }

        /**
         * 返回错误消息
         *
         * @param code 状态码
         * @param msg  返回内容
         * @return 警告消息
         */
        fun error(code: Int, msg: String?): R {
            return R(code, msg, null, false)
        }
    }
}
